(function () {
  var widgetName = 'map'

  UM.registerWidget(widgetName, {

    tpl: '<style type="text/css">' +
            '.edui-dialog-map .edui-map-content{width:530px; height: 350px;margin: 10px auto;}' +
            '.edui-dialog-map .edui-map-content table{width: 100%}' +
            '.edui-dialog-map .edui-map-content table td{vertical-align: middle;}' +
            '.edui-dialog-map .edui-map-button { border: 1px solid #ccc; float: left; cursor: default; height: 23px; width: 70px; cursor: pointer; margin: 0; font-size: 12px; line-height: 24px; text-align: center; }' +
            '.edui-dialog-map .edui-map-button:hover {background:#eee;}' +
            '.edui-dialog-map .edui-map-city,.edui-dialog-map .edui-map-address{height:21px;background: #FFF;border:1px solid #d7d7d7; line-height: 21px;}' +
            '.edui-dialog-map .edui-map-city{width:90px}' +
            '.edui-dialog-map .edui-map-address{width:150px}' +
            '.edui-dialog-map .edui-map-dynamic-label span{vertical-align:middle;margin: 3px 0px 3px 3px;}' +
            '.edui-dialog-map .edui-map-dynamic-label input{vertical-align:middle;margin: 3px;}' +
            '</style>' +
            '<div class="edui-map-content">' +
            '<table>' +
            '<tr>' +
            '<td><%=lang_city%>:</td>' +
            '<td><input class="edui-map-city" type="text" value="<%=city.value%>"/></td>' +
            '<td><%=lang_address%>:</td>' +
            '<td><input class="edui-map-address" type="text" value="" /></td>' +
            '<td><a class="edui-map-button"><%=lang_search%></a></td>' +
            '<td><label class="edui-map-dynamic-label"><input class="edui-map-dynamic" type="checkbox" name="edui-map-dynamic" /><span><%=lang_dynamicmap%></span></label></td>' +
            '</tr>' +
            '</table>' +
            '<div style="width:100%;height:340px;margin:5px auto;border:1px solid gray" class="edui-map-container"></div>' +
            '</div>' +
            '<script class="edui-tpl-container" type="text/plain">' +
            '<!DOCTYPE html>' +
            '<html>' +
            '<head>' +
            '<title></title>' +
            '</head>' +
            '<body>' +
            '<scr_ipt>' +
            'window.onload = function(){' +
            'var scripts = document.scripts || document.getElementsByTagName("script"),' +
            'src = [];' +
            'for( var i = 1, len = scripts.length; i<len; i++ ) {' +
            'src.push( scripts[i].src );' +
            '}' +
            "parent.UM.getEditor(<<id>>).getWidgetData(\'map\').requestMapApi( src );" +
            '};' +
            'function mapReadyStateChange ( state ) { ' +
            " if ( state === 'complete' || state === 'loaded' ) {" +
            ' document.close(); ' +
            ' } }' +
            '</scr_ipt>' +
            "<scr_ipt onreadystatechange='mapReadyStateChange(this.readyState);' onload='mapReadyStateChange(\"loaded\");' src=\"//api.map.baidu.com/api?v=2.0&ak=6b6c1a67eaa7db1ca6d6da28e590e343&services=true\"></scr_ipt>" +
            '</body>' +
            '</html>' +
            '</script>',
    initContent: function (editor, $widget) {
      var me = this,
        lang = editor.getLang(widgetName),
        theme_url = editor.options.themePath + editor.options.theme

      if (me.inited) {
        me.preventDefault()
        return false
      }

      me.inited = true

      me.lang = lang
      me.editor = editor

      me.root().html($.parseTmpl(me.tpl, $.extend({}, lang['static'], {
        'theme_url': theme_url
      })))

      me.initRequestApi()
    },
    /**
         * 初始化请求API
         */
    initRequestApi: function () {
      var $ifr = null

      // 已经初始化过， 不用再次初始化
      if (window.BMap && window.BMap.Map) {
        this.initBaiduMap()
      } else {
        $ifr = $('<iframe style="display: none;"></iframe>')
        $ifr.appendTo(this.root())

        $ifr = $ifr[ 0 ].contentWindow.document

        $ifr.open()
        $ifr.write(this.root().find('.edui-tpl-container').html().replace(/scr_ipt/g, 'script').replace('<<id>>', "'" + this.editor.id + "'"))
      }
    },
    requestMapApi: function (src) {
      var me = this

      if (src.length) {
        var _src = src[0]

        src = src.slice(1)

        if (_src) {
          $.getScript(_src, function () {
            me.requestMapApi(src)
          })
        } else {
          me.requestMapApi(src)
        }
      } else {
        me.initBaiduMap()
      }
    },
    initBaiduMap: function () {
      var $root = this.root(),
        map = new BMap.Map($root.find('.edui-map-container')[0]),
        me = this,
        marker,
        point,
        imgcss,
        img = $(me.editor.selection.getRange().getClosedNode())

      map.enableInertialDragging()
      map.enableScrollWheelZoom()
      map.enableContinuousZoom()

      if (img.length && /api[.]map[.]baidu[.]com/ig.test(img.attr('src'))) {
        var url = img.attr('src'),
          centerPos = me.getPars(url, 'center').split(','),
          markerPos = me.getPars(url, 'markers').split(',')
        point = new BMap.Point(Number(centerPos[0]), Number(centerPos[1]))
        marker = new BMap.Marker(new BMap.Point(Number(markerPos[0]), Number(markerPos[1])))
        map.addControl(new BMap.NavigationControl())
        map.centerAndZoom(point, Number(me.getPars(url, 'zoom')))
        imgcss = img.attr('style')
      } else {
        point = new BMap.Point(116.404, 39.915) // 创建点坐标
        marker = new BMap.Marker(point)
        map.addControl(new BMap.NavigationControl())
        map.centerAndZoom(point, 10) // 初始化地图,设置中心点坐标和地图级别。
      }
      marker.enableDragging()
      map.addOverlay(marker)

      me.map = map
      me.marker = marker
      me.imgcss = imgcss
    },
    doSearch: function () {
      var me = this,
        city = me.root().find('.edui-map-city').val(),
        address = me.root().find('.edui-map-address').val()

      if (!city) {
        alert(me.lang.cityMsg)
        return
      }
      var search = new BMap.LocalSearch(city, {
        onSearchComplete: function (results) {
          if (results && results.getNumPois()) {
            var points = []
            for (var i = 0; i < results.getCurrentNumPois(); i++) {
              points.push(results.getPoi(i).point)
            }
            if (points.length > 1) {
              me.map.setViewport(points)
            } else {
              me.map.centerAndZoom(points[0], 13)
            }
            point = me.map.getCenter()
            me.marker.setPoint(point)
          } else {
            alert(me.lang.errorMsg)
          }
        }
      })
      search.search(address || city)
    },
    getPars: function (str, par) {
      var reg = new RegExp(par + '=((\\d+|[.,])*)', 'g')
      return reg.exec(str)[1]
    },
    reset: function () {
      this.map && this.map.reset()
    },
    initEvent: function () {
      var me = this,
        $root = me.root()

      $root.find('.edui-map-address').on('keydown', function (evt) {
        evt = evt || event
        if (evt.keyCode == 13) {
          me.doSearch()
          return false
        }
      })

      $root.find('.edui-map-button').on('click', function (evt) {
        me.doSearch()
      })

      $root.find('.edui-map-address').focus()

      $root.on('mousewheel DOMMouseScroll', function (e) {
        return false
      })
    },
    width: 580,
    height: 408,
    buttons: {
      ok: {
        exec: function (editor) {
          var widget = editor.getWidgetData(widgetName),
            center = widget.map.getCenter(),
            zoom = widget.map.getZoom(),
            size = widget.map.getSize(),
            point = widget.marker.P

          if (widget.root().find('.edui-map-dynamic')[0].checked) {
            var URL = editor.getOpt('UMEDITOR_HOME_URL'),
              url = [URL + (/\/$/.test(URL) ? '' : '/') + 'dialogs/map/map.html' +
                                '#center=' + center.lng + ',' + center.lat,
              '&zoom=' + zoom,
              '&width=' + size.width,
              '&height=' + size.height,
              '&markers=' + point.lng + ',' + point.lat].join('')
            editor.execCommand('inserthtml', '<iframe class="ueditor_baidumap" src="' + url + '" frameborder="0" width="' + (size.width + 4) + '" height="' + (size.height + 4) + '"></iframe>')
          } else {
            url = '//api.map.baidu.com/staticimage?center=' + center.lng + ',' + center.lat +
                            '&zoom=' + zoom + '&width=' + size.width + '&height=' + size.height + '&markers=' + point.lng + ',' + point.lat
            editor.execCommand('inserthtml', '<img width="' + size.width + '"height="' + size.height + '" src="' + url + '"' + (widget.imgcss ? ' style="' + widget.imgcss + '"' : '') + '/>', true)
          }

          widget.reset()
        }
      },
      cancel: {
        exec: function (editor) {
          editor.getWidgetData(widgetName).reset()
        }
      }
    }
  })
})()
